python实战小项目,多线程百度云盘下载,突破限速,超越迅雷超高速下载 您所在的位置:网站首页 python 百度网盘下载提速 python实战小项目,多线程百度云盘下载,突破限速,超越迅雷超高速下载

python实战小项目,多线程百度云盘下载,突破限速,超越迅雷超高速下载

#python实战小项目,多线程百度云盘下载,突破限速,超越迅雷超高速下载| 来源: 网络整理| 查看: 265

原帖:向日葵智能

计划做这样的多线程下载是因为百度云盘限速厉害,到了恶心的地步,我想试试用多线程下载百度云盘的资源是否能够实现加速。

百度云盘限速分析 1. 关于限速,我揣测有两种情况: 限制下载资源的带宽限制下载资源时的线程或者进程数目 如果限速是第一种,多线程下载也无法提速。但如果是第二种限速,多线程下载理应能够显著提升下载速度,在一定范围内,提速的程度与下载的线程数目成正相关关系。即,下载的线程越多,下载总速度越快。 2. 多线程下载的具体思路如下: 获取待下载文件的大小 size将待下载文件分成 n 块,第 i 块大小为 subi ,n 个 subi 之和等于 size在下载进程中开启 n 个线程,每个线程负责下载一个 sub所有线程下载的资源按照原有顺序写入文件,完成后,该文件即为下载后的文件 百度云盘多线程加速下载,具体实现如下 1. 获取待下载文件的 size

以下载 python 2.7 为例,下载链接:点我下载,点击该链接时,应该会直接弹出下载窗口。通常,文件大小,文件名等信息都在请求 headers 里,python 可用如下代码获取该文件 headers:

import requests url = "http://sw.bos.baidu.com/sw-search-sp/software/f4373126dba59/python_2.7.13150.msi" res = requests.head(url) print res.headers Python Copy

输出结果是一个 json 数据,格式化显示如下:

输出的 json 数据

显然,该文件大小为 19161088 字节。

2. 将下载文件分为 n 个小块

这一步其实就是简单的数学题了,下面直接上代码,以 n=5 等分为例,如下:

size = int(res.headers["Content-Length"]) print "total size: %d" % size n = 5 spos = [] fpos = [] persize = int(size/n) intsize = persize * n # 整除部分 for i in range(0, intsize, persize): spos.append(i) fpos.append(i+persize-1) if intsize } header["Range"] = "bytes=20-40" # 指定下载的字节段 res = requests.get(url, headers=header) # 将 header 添加到请求中 fp = open(filename, "wb") fp.seek(20) # 指定写文件的位置 fp.write(res.content) # 将下载文件保存到 filename 里 fp.close() Python Copy 5. python 多线程高速下载

在第 3、4 节基础上,写下如下函数:

def downloadFile(url, spos, fpos, fp): try: header = {} header["Range"] = "bytes=%d-%d" % (spos, fpos) res = requests.get(url, headers=header) fp.seek(spos) fp.write(res.content) except Exception, e: print "downloadFile error: ", e Python Copy

该函数将从 url 下载 spos-fpos 段的内容,写到 fp 的指定位置处。结合第 1、2 节,开 n 个线程下载 python 2.7,具体代码如下,直接采用了 threading 库:

import threading fp = open("test.msi", "wb") fp.close() fp = open("test.msi", "rb+") tmp = [] start_time = time.time() # 计时起始点,为了计算平均速度 for i in range(0, n): t = threading.Thread(target=downloadFile, args=(url, spos[i], fpos[i], fp)) t.setDaemon(True) # 主进程结束时,线程也随之结束 t.start() tmp.append(t) for i in tmp: i.join() # 等待线程结束 fp.close() finish_time = time.time() # 计时终点,为了计算平均速度 speed = float(size)/( 1000.0*(finish_time-start_time)) print "spend time: %0.2f s" % float(finish_time-start_time) print "finished... average speed: %0.2f KB/s" % speed Python Copy

打印结果如下:

下载速度

可见,该程序很快的将文件下载了,速度达到 9M/s 以上。文件也可以正常打开,如下图:

下载的文件

6. 测试下载被限速的百度云盘,观察是否提速成功

第 5 节提供的下载 python 2.7 文件没有被限速,不能体现本贴程序的提速性能。接下来,测试下载被恶心限速的 xx 云盘的文件,采用的下载链接可以自行从自己的云盘里提取:

提取下载链接

我的url是 https://nj01ct01.baidupcs.com/file/…

直接采用浏览器下载时,速度最快达到 18KB/s,且经常出现速度为 0 的情况,下载 3m 多点的文件用了 好几分钟,如下图:

浏览器低速下载

采用本帖下载时,输出如下,用时 65 秒,速度 51 KB/s:

5倍速下载

速度提升了 5 倍,我们增加线程数,即增大加速倍数,再试。将线程数目增加到 30,即 令 n=30 时,同样下载该链接,输出如下,用时 12s, 速度 279 KB/s,速度提升了 30 倍:

30 倍速下载

可见,采用本帖提供的 python 多线程下载百度网盘,的确可以显著提升下载速度。

转载自:https://www.xrkzn.cn/python-projects/python-project-multi-threads-download-baidu-cloud-files-in-high-speed/



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有